// {
//   const target = {
//     id: 'target'
//   };

//   const handler = {};

//   const proxy = new Proxy(target, handler);

//   // id 属性会访问同一个值
//   console.log(target.id); // target 
//   console.log(proxy.id); // target 

//   // 给目标属性赋值会反映在两个对象上
//   // 因为两个对象访问的是同一个值
//   target.id = 'foo';
//   console.log(target.id);
//   console.log(proxy.id);

//   // 给代理属性赋值会反映在两个对象上
//   // 因为这个赋值会转移到目标对象
//   proxy.id = 'bar';
//   console.log(target.id);
//   console.log(proxy.id);

//   // 使用 hasOwnProperty() 来判断，都会应用到目标对象。
//   console.log(target.hasOwnProperty('id'))
//   console.log(proxy.hasOwnProperty('id'))

//   console.log(target instanceof Proxy);
//   // TypeError: Function has non-object prototype 'undefined' in instanceof check
//   console.log(proxy instanceof Proxy);
//   // TypeError: Function has non-object prototype 'undefined' in instanceof check
// }


{
  const target = {
    foo: 'bar'
  }

  const handler = {
    // 捕获器在处理程序对象中以方法名为键
    get() {
      return 'handler override'
    }
  }

  const proxy = new Proxy(target, handler)

  console.log(target.foo)
  console.log(proxy.foo)
}

{
  const target = {
    foo: 'bar'
  };
  const handler = {
    get() {
      return Reflect.get(...arguments);
    }
  };
  const proxy = new Proxy(target, handler);
  console.log(proxy.foo); // bar 
  console.log(target.foo); // bar
}

{
  // 撤销代理
  const target = {
    foo: 'bar'
  }

  const handler = {
    get() {
      return 'intercepted'
    }
  }

  const { proxy, revoke } = Proxy.revocable(target, handler)

  console.log(proxy.foo)
  console.log(target.foo)

  revoke()

  console.log(proxy.foo) // Uncaught TypeError: Cannot perform 'get' on a proxy that has been revoked
}